﻿Imports Microsoft.DirectX
Imports Microsoft.DirectX.Direct3D
Public Class ObjektGebaeude3D
    Private Structure GebaeudeInstanz
        Public Mesh As Objekt3D
        Public GebaeudeID As String
    End Structure
    Dim Gebaeude() As GebaeudeInstanz = {}


    Public Sub IniGebaeude()
        Dim GStack As New Stack(Of GebaeudeInstanz)
        For Each Dat In My.Computer.FileSystem.GetFiles(DataSettings.Resourcenpfad + "Buildings\3D\")
            If Dat.ToLower.EndsWith(".X".ToLower) Then
                'Hoffentlich ein gueltiges Format, und kein unnuetzes Gebaeude!
                Dim Geb As GebaeudeInstanz
                Geb.GebaeudeID = Dat.Remove(0, Dat.LastIndexOf("\") + 1).ToUpper.Replace(".X".ToUpper, "")
                Geb.Mesh = New Objekt3D()
                Geb.Mesh.MeshBildLaden(Dat)
                GStack.Push(Geb)
            End If
        Next
        Gebaeude = GStack.ToArray
        'Array.Reverse(Gebaeude)'nur, damit die Reihenfolge wieder stimmt!
        GStack.Clear() 'brauchen wir nicht mehr.
    End Sub
    Public Sub IniSpielerfarben(ByVal Spieler() As ObjektSpieler)
        ReDim Objekt3D.Spielerfarben(Spieler.Length - 1)
        For I = 0 To Spieler.Length - 1
            Objekt3D.Spielerfarben(I) = Spieler(I).Farbe
        Next
    End Sub
    Public Sub Malen(ByVal GebaeudeID As String, ByVal X As Integer, ByVal Y As Integer, ByVal Schlacht As Integer, ByVal Spieler As Integer)
        If Grafikengine.IsSphaereInFrustumPlane(New Vector3(X, 1, -Y), 2) Then
            For i = 0 To Gebaeude.Length - 1
                If Gebaeude(i).GebaeudeID.ToUpper = GebaeudeID.ToUpper Then

                    Dim standardMatrix As Matrix = Grafikengine.Grafikkarte.Transform.World
                    Dim M As Matrix = Matrix.Identity
                    M.M41 = X
                    M.M43 = -Y
                    Grafikengine.Grafikkarte.Transform.World = M
                    Dim Eingef As Boolean
                    Objekt3D.SpielerFarbe = ObjektmarkiertesFeld.getFeldFarbe(X, Y, Objekt3D.Spielerfarben(Spieler), Eingef)
                    If DataSettings.TotalEinfaerben Or Eingef Then
                        Gebaeude(i).Mesh.Malen(M, True)
                    Else
                        Gebaeude(i).Mesh.Malen(M)
                    End If

                    Grafikengine.Grafikkarte.Transform.World = standardMatrix
                    Exit Sub
                End If
            Next
        End If
        'Console.WriteLine("folgendes GebaeudeMesh fehlt: " + GebaeudeID)
    End Sub
    Public Function getMesh(ByVal GebaeudeID As String) As Mesh
        For i = 0 To Gebaeude.Length - 1
            If Gebaeude(i).GebaeudeID.ToUpper = GebaeudeID.ToUpper Then
                Return Gebaeude(i).Mesh.MeshBild.moMesh
            End If
        Next
        Return Nothing
    End Function
End Class
